"""
中间件模块
处理请求前后的通用逻辑，如日志记录、性能监控等
"""
import time
import logging
from flask import g, request, current_app
from app.extensions import db

logger = logging.getLogger(__name__)

def register_middlewares(app):
    """
    注册应用中间件
    
    参数:
        app: Flask应用实例
    """
    app.before_request(before_request)
    app.after_request(after_request)
    app.teardown_request(teardown_request)
    
    app.logger.info('已注册中间件')


def before_request():
    """请求前处理"""
    # 记录请求开始时间
    g.start_time = time.time()
    
    # 记录请求信息
    current_app.logger.debug(f'开始处理请求: {request.method} {request.path}')


def after_request(response):
    """
    请求后处理
    
    参数:
        response: Flask响应对象
    返回:
        处理后的响应对象
    """
    # 计算请求处理时间
    if hasattr(g, 'start_time'):
        elapsed = time.time() - g.start_time
        
        # 记录慢请求（超过1秒）
        if elapsed > 1:
            current_app.logger.warning(
                f'慢请求: {request.method} {request.path} 耗时 {elapsed:.2f}秒'
            )
        else:
            current_app.logger.debug(
                f'请求处理完成: {request.method} {request.path} 耗时 {elapsed:.2f}秒'
            )
    
    # 添加安全相关的响应头
    response.headers['X-Content-Type-Options'] = 'nosniff'
    response.headers['X-Frame-Options'] = 'DENY'
    response.headers['X-XSS-Protection'] = '1; mode=block'
    
    return response


def teardown_request(exception=None):
    """
    请求结束处理，无论是否有异常发生
    
    参数:
        exception: 如果有异常发生，这里会传入异常对象
    """
    # 确保数据库会话被关闭
    try:
        db.session.remove()
    except Exception as e:
        current_app.logger.error(f'关闭数据库会话时出错: {str(e)}')
    
    # 如果有异常，记录错误日志
    if exception:
        current_app.logger.error(f'请求处理异常: {str(exception)}') 